import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer, SafeHtml, SafeStyle, SafeScript, SafeUrl, SafeResourceUrl } from '@angular/platform-browser';

/**
 * 安全内容管道
 * 
 * 功能：
 * - 绕过 Angular 的安全检查，允许渲染动态 HTML、样式、脚本等内容
 * - 用于渲染可信任的动态内容（如富文本编辑器、用户生成的内容等）
 * 
 * ⚠️ 安全警告：
 * - 仅用于渲染完全可信任的内容，否则可能导致 XSS 攻击
 * - 确保内容来源可信，已经过验证和清理
 * 
 * 使用示例：
 * ```html
 * <!-- 渲染 HTML -->
 * <div [innerHTML]="htmlContent | safe: 'html'"></div>
 * 
 * <!-- 允许内联样式 -->
 * <div [style]="dynamicStyle | safe: 'style'"></div>
 * 
 * <!-- 允许外部 URL -->
 * <iframe [src]="videoUrl | safe: 'resourceUrl'"></iframe>
 * ```
 * 
 * 支持的类型：
 * - 'html': 允许 HTML 标签
 * - 'style': 允许 CSS 样式
 * - 'script': 允许 JavaScript（不推荐使用）
 * - 'url': 允许任意 URL
 * - 'resourceUrl': 允许资源 URL（图片、媒体等）
 */
@Pipe({
  name: 'safe',
  standalone: true
})
export class SafePipe implements PipeTransform {

  constructor(protected sanitizer: DomSanitizer) {}

  /**
   * 转换不安全的内容为 Angular 安全类型
   * 
   * @param value - 要转换的内容
   * @param type - 内容类型：'html' | 'style' | 'script' | 'url' | 'resourceUrl'
   * @returns Angular 安全类型包装后的内容
   * @throws Error 如果类型无效
   */
  public transform(value: any, type: string): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl {
    switch (type) {
      case 'html': return this.sanitizer.bypassSecurityTrustHtml(value);
      case 'style': return this.sanitizer.bypassSecurityTrustStyle(value);
      case 'script': return this.sanitizer.bypassSecurityTrustScript(value);
      case 'url': return this.sanitizer.bypassSecurityTrustUrl(value);
      case 'resourceUrl': return this.sanitizer.bypassSecurityTrustResourceUrl(value);
      default: throw new Error(`Invalid safe type specified: ${type}`);
    }
  }
}
